var express = require('express'),
  // swig = require('swig-templates'),
  request = require('request'),
  // wx = require('../base/wx'),
  router = express.Router();

// var helper = function(fn) {
//   // 用于存储回调函数，该函数复用于所有用于helper处理的异步函数
//   // 关键就在于这里，feed 其实就是异步的回调函数；
//   // 通过 helper(asyncFun), 此时的回调函数形式是错误的，而且 feed 是undefined；
//   // 但是当调用回调函数时，本次轮回结束，导致 feed 就有值了，所以 ddd 中的 feed.apply 可以正确执行；
//   // 也就得到了正确的结果；
//   var feed;
//   /**
//    * 执行次序分析：
//    *    helper的参数fn是一个异步函数，通过helper的处理，返回一个含有内部处理逻辑
//    *    的函数，该函数封装了所需参数和可能的回调函数feed，并且返回一个设置feed的函数。
//    *
//    *    在具体的使用中，通过helper函数封装fs.readFile，获取readFile。当执行第一个
//    *    片段时，首先将所有的参数（包括feed）合并到args，并执行异步调用返回处理函数；此时
//    *    我们用获取的返回函数设置回调函数，进而影响到args中的最后一项的函数
//    */

//   return function aaa(){
//     var args = [].slice.call(arguments);

//     args.push(function ddd(){
//       if(feed) {
//         // console.log(feed); // [Function: ccc]
//         feed.apply(null,arguments);
//       }
//       //console.log(feed)
//     });
//     fn.apply(null, args);
//     // console.log('fn执行中');
//     // 返回一个函数，用于给yield之前的变量赋值
//     return function bbb(fn){
//       feed = fn;
//     }
//   }
// };
// var flow = function(gfn) {
//   var generator = gfn();
//   next();

//   function next(data){
//     // console.log('next--data');
//     // console.log(typeof data);
//     generator.ret = generator.next(data);
//     // console.log(generator.ret);
//     // console.log(generator.ret.value);// [Function: bbb]
//     if(generator.ret.done){
//       return;
//     }
//     generator.ret.value(
//       function ccc(error, res, d){
//         // console.log('ccc');
//         if(error)
//           throw error;
//         // console.log('error', error);
//         // console.log('d', d);
//         next.apply(null,[].slice.call(arguments, 2));
//       }
//     );
//   }
// };


router.get('/', function(req, res, next) {
  // wx.goAccessToken(req, res, function() {
  //   res.redirect("/home");
  // });  

  // var err = new Error('haha');
  // err.status = 200;
  // next(err);


  res.cookie('user_id', 1, {
    maxAge: config.cookieTime,
    httpOnly: false
  });
  res.redirect("/home");
});

// ***********************************************************
// ***********************************************************

/*
// 线上代码
router.get('/home', function(req, res, next) {
  if (parseInt(req.cookies.user_id) > 0) {
    request.get({
      url: config.resourcePath.apiRoot + '/index/index/goods?user_id=' + req.cookies.user_id
    }, function(error, response, body) {
      try {
        var result = JSON.parse(body);
        if (result.code == 200) {
          // console.log(result);
          var rundData = {
            message: result.message
          };
          res.render('page/home', rundData);
        }
      } catch (e) {
        var err = new Error('Not Found');
        err.status = 500;
        next(err);
        return;
      }
    });
  } else {
    res.cookie('user_id', false, {
      maxAge: config.cookieTime,
      httpOnly: false
    });
    res.redirect("/");
  }
});
*/
// ***********************************************************
// ***********************************************************

/*
// 配合上面的 helper和flow 两个辅助函数实现异步转同步；
router.get('/home', function(req, res, next) {
  if (parseInt(req.cookies.user_id) > 0) {    
    flow(function* (){
      let requestSync = helper(request.get);
      let result = yield requestSync({
        url: config.resourcePath.apiRoot + '/index/index/goods?user_id=' + req.cookies.user_id,
        json: true
      });
      console.log(result);
      console.log(typeof result);
      // res.send('ooo~');
      if (result && result.code == 200) {
        // console.log(result);
        var rundData = {
          message: result.message
        };
        res.render('page/home', rundData);
      }
    });
  } else {
    res.cookie('user_id', false, {
      maxAge: config.cookieTime,
      httpOnly: false
    });
    res.redirect("/");
  }
});
 */
// ***********************************************************
// ***********************************************************

router.get('/home', function(req, res, next) {
  if (parseInt(req.cookies.user_id) > 0) {    
    req.app.sync(function* (){
      let requestSync = req.app.async2sync(request.get);
      let result = yield requestSync({
        url: config.resourcePath.apiRoot + '/index/index/goods?user_id=' + req.cookies.user_id,
        json: true
      });
      console.log(JSON.stringify(result));
      /*
      {
      "code":200,
      "message":[
        {
        "type":"mobile",
        "data":[
          {"nav_id":1,"name":"iPhone15元","node_url":"/uploads/brand/20170724/23b2d6b9c04d139c1c7f4a64cdc57ba6.jpg"},
          {"nav_id":2,"name":"HUAWEI15元","node_url":"/uploads/brand/20170724/4aa2f02d5989a2fa7fafbdf9677a6faf.jpg"},
          {"nav_id":3,"name":"OPPO15元","node_url":"/uploads/brand/20170724/7d04aa812f7f3bede31e5c373db5ed39.jpg"}
        ]},

        {
        "type":"cup",
        "data":[
          {"cup_id":4,"name":"18oz吸管杯79.9元系列","node_url":"/uploads/cup/20180130/5848c46ea9436f0e0c40ee60a7dbe28e.jpg","origin_price":"79.90"},
          {"cup_id":6,"name":"22oz吸管杯79.9元系列","node_url":"/uploads/cup/20180124/ca142f6d21d5df45e925528574d022f8.jpg","origin_price":"79.90"},
          {"cup_id":7,"name":"16oz吸管杯79.9元系列","node_url":"/uploads/cup/20180130/99cd95996bb0cc420264836562c48725.jpg","origin_price":"79.90"}
        ]},

        {
        "type":"bag",
        "data":[
          {"bag_id":5,"name":"横款无拉链","node_url":"/uploads/bag/20180308/d097279c033b9b79da49936845e00e18.jpg","origin_price":"15.00"},
          {"bag_id":7,"name":"竖版两用","node_url":"/uploads/bag/20180308/de0d1cf034eefecd00c125d6c1f55b53.jpg","origin_price":"15.00"},
          {"bag_id":8,"name":"竖版飘带","node_url":"/uploads/bag/20180308/06c9fee8070d9bbb8f0b00e0c6765eba.jpg","origin_price":"15.00"}
        ]}
      ],
      "imsg":"获取数据成功."
      }
       */
      console.log(typeof result);
      // console.log(typeof result.index1);
      // console.log(typeof result.index2);
      if (result && result.code == 200) {
        var rundData = {
          message: result.message
        };
        res.render('page/home', rundData);
      }
    }, 2);
    // request 模块的回调默认情况下是 function(error, response, body)，有三个参数；
    // 请求参数没有 json:true 时，sync 参数二：
    //    为 1 时，result 就是第 2 个参数 response，typeof的结果是 object；response.body 就是 string；response.statusCode 就是响应码；
    //    为 2 时，result 就是第 3 个参数 body，typeof的结果是 string；
    // 请求参数有 json:true 时，sync 参数二：
    //    为 1 时，result 就是第 2 个参数 response，typeof的结果是 object；response.body 就是 object；
    //    为 2 时，result 就是第 3 个参数 body，typeof的结果还是 object；
    
    // 请求参数没有 json:true ，并且 sync 参数二为 true 时：
    //    result 就是对象，有两个key：index1和index2；
    //    result.index1 就是 response，typeof的结果是 object；response.body 就是 string；
    //    result.index2 就是 body，typeof的结果是 string；
    // 请求参数有 json:true ，并且 sync 参数二为 true 时：
    //    result.index1 就是 response，typeof的结果是 object；response.body 就是 object；
    //    result.index2 就是 body，typeof的结果是 object；
  } else {
    // res.cookie('user_id', false, {
    //   maxAge: config.cookieTime,
    //   httpOnly: false
    // });
    res.clearCookie('user_id');
    res.redirect("/");

    // 上面的else 改成一个中间件统一处理cookie无效时的操作
    // next();
  } 
});

module.exports = router;